package com.cmw.core.ssm.dao;


import java.util.List;
import java.util.Map;

/**
 * Created by Administrator on 2017-05-16.
 */
public interface GenericDaoInter<T, PK > {
    /**
     * 根据主键ID获取单个对象
     * @param id 主键ID
     * @return 返回符合条件的实体对象
     * @  抛出DaoException
     */
    T get(final PK id);

    /**
     * 根据指定的参数 获取单个对象
     * @param <K>
     * @param <V>
     * @param params 查找时过滤参数
     * @return 返回符合条件的实体对象
     */
    T getByPars(final Map<String, Object> params);

    /**
     * 根据指定的参数 以List 对象返回符合条件的数据
     * @param <K>
     * @param <V>
     * @param map
     * @return 返回List对象
     * @  抛出DaoException
     */
    List<T> getList(final Map<String, Object> map);

    /**
     * 根据指定的参数 以List<Map<String,Object>> 对象返回符合条件的数据
     * @param <K>
     * @param <V>
     * @param map
     * @return 返回List对象
     * @  抛出DaoException
     */
    List<Map<String,Object>> getListMap(final Map<String, Object> map);

    /**
     * 返回所有符合条件的数据
     * @param <K>
     * @param <V>
     * @param map
     * @return 返回List对象
     * @  抛出DaoException
     */
    List<T> getListAll();

    /**
     * 根据指定的参数 以List 对象返回符合条件的数据
     * @param <K>
     * @param <V>
     * @param map
     * @return 返回List对象
     * @  抛出DaoException
     */
    List<T> getPageByPars(Map<String, Object> map);

    /**
     * 获取总记录数
     * @return 总记录数
     * @ 抛出DaoException
     */
    Long getTotals();

    /**
     * 根据参数条件获取总记录数
     * @param param 过滤参数
     * @return 返回记录总数
     * @ 抛出DaoException
     */
    Long getTotalsByPars(Map<String, Object> param);

    /**
     * 返回数据库中最大的主键ID
     * @return 最大的ID
     * @  抛出DaoException
     */
    Long getMaxID();

    /**
     * 保存对象
     * @param <T>
     * @param obj 要保存的实体
     * @return 返回该实体的主键ID
     * @ 抛出DaoException
     */
    int insert(T obj) ;

    /**
     * 批量保存实体(默认 50 个提交一次)
     * @param objs	要保存的实体 List
     * @return 返回所有保存成功的实体的 ID 列表
     * @
     */
    void batchInsert(List<T> list) ;

    /**
     * 保存或更新对象
     * @param <T>
     * @param obj 要保存或更新的对象
     * @return 返回该实体的主键ID
     * @ 抛出DaoException
     */
    void update(T obj) ;

    /**
     * 批量保存或更新对象 (默认 50 个提交一次)
     * @param <T>
     * @param list 要保存或更新的对象
     * @return 返回该实体的主键ID
     * @ 抛出DaoException
     */
    void batchUpdate(List<T> list);

    /**
     * 更新对象
     * @param <T>
     * @param obj 要更新的对象
     * @ 抛出DaoException
     */
    void updateByPars(Map<String, Object> map) ;

    /**
     * 根据ID删除实体对象
     * @param entityClass
     * @param id 根据主键ID删除实体对象
     */
    void delete(final PK id);

    /**
     * 根据指定的参数，删除实体
     * @param <K> 键类型
     * @param <V> 值类型
     * @param params 删除实体时的过滤参数
     */
    void deleteByPars(final Map<String, Object> params);

    /**
     * 根据 主键ID字符串【多个主键ID以“，”分隔】批量删除实体
     * @param ids 以逗号拼接的主键ID字符串
     * @  抛出DaoException
     */
    void deleteByIds(final Map<String, Object> pars);

    /**
     * 删除所有数据
     */
    void deleteAll();

    /**
     * 根据主键ID禁用实体
     * @param id 主键ID
     * @param isenabled 禁用值, isenabled : 0 禁用 1: 起用
     */
    void enabled(final Map<String, Object> params);

    /**
     * 根据指定的参数，禁用或启用实体
     * @param <K> 键类型
     * @param <V> 值类型
     * @param params 删除实体时的过滤参数
     */
    void enabledByPars(final Map<String, Object> params);

    /**
     * 根据 主键ID字符串【多个主键ID以“，”分隔】批量禁用实体
     * @param ids 以逗号拼接的主键ID字符串
     * @  抛出DaoException
     */
    void enabledByIds(final Map<String, Object> params);
}
